package net.csdn.business.kanban.api.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import net.csdn.business.kanban.api.entity.Kanban;
import net.csdn.business.kanban.api.mapper.KanbanMapper;
import net.csdn.business.kanban.api.service.KanbanService;
import net.csdn.business.kanban.common.constant.RedisConstants;
import net.csdn.business.kanban.common.domain.PageDto;
import net.csdn.business.kanban.common.domain.request.KanbanQuery;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

/**
 * @ClassName KanbanServiceImpl
 * @Description TODO
 * @Author liuzhisheng
 * @Date 2023/9/13
 **/
@Service
@RequiredArgsConstructor
public class KanbanServiceImpl extends ServiceImpl<KanbanMapper, Kanban> implements KanbanService {
    private final KanbanMapper kanbanMapper;


    @Override
    public PageDto<Kanban> kanbanList(KanbanQuery kanbanQuery) {
        LambdaQueryWrapper<Kanban> wrapper = new LambdaQueryWrapper();
        wrapper.eq(Kanban::getOrgId,kanbanQuery.getOrgId());
        wrapper.eq(Kanban::getStatus,kanbanQuery.getStatus());
        wrapper.like(!ObjectUtils.isEmpty(kanbanQuery.getKanbanName()),Kanban::getKanbanName,kanbanQuery.getKanbanName());
//        /**判断用户是否登录，未登录只能查询公开看板，已登录则校验是否存在为该组织成员*/
//        if(StringUtils.isBlank(kanbanQuery.getUid())){
//            wrapper.eq(Kanban::getIsPublic,Boolean.TRUE);
//        }else {
//            /**表示如果用户没有该组织的权限，则只能查看公开看板*/
//            String roleCode = orgFeignClient.getRoleInfo(new OrgRoleDto(kanbanQuery.getUid(),null,kanbanQuery.getOrgId()));
//            if (StringUtils.isBlank(roleCode)) {
//                wrapper.eq(Kanban::getIsPublic,Boolean.TRUE);
//            }
//        }
        wrapper.orderBy(true,kanbanQuery.getSortOrder() == 1 ? false : true, Kanban::getUpdatedAt);
        Page<Kanban> page = new Page<>(kanbanQuery.getPageNum(), kanbanQuery.getPageSize(),  Boolean.TRUE);
        IPage<Kanban> iPage = kanbanMapper.selectPage(page,wrapper);
        return PageDto.build(iPage);
    }

    @Override
    public Boolean removeKanban(String kanbanId) {
        QueryWrapper<Kanban> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(Kanban::getObjectId,kanbanId);
        return kanbanMapper.delete(queryWrapper) > 0 ? true : false;
    }

    @Override
    public Boolean updateKanban(Kanban kanban) {
        UpdateWrapper<Kanban> wrapper = new UpdateWrapper();
        wrapper.lambda().eq(Kanban::getObjectId, kanban.getObjectId());
        return kanbanMapper.update(kanban,wrapper) > 0 ? true : false;
    }

    @Override
    @Cacheable(value = RedisConstants.KANBAN, key = "'kanban-' + #kanbanId", unless = "null == #result")
    public Kanban getKanbanByObjectId(String kanbanId) {
        QueryWrapper<Kanban> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(Kanban::getObjectId,kanbanId);
        return kanbanMapper.selectOne(queryWrapper);
    }

    @Override
    public Long kanbanNumber(String orgId) {
        QueryWrapper<Kanban> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(Kanban::getOrgId,orgId);
        return kanbanMapper.selectCount(queryWrapper);
    }
}
